/**
 * Software License, Version 1.0
 * 
 * Copyright 2003 The Trustees of Indiana University.  All rights reserved.
 * 
 *
 *Redistribution and use in source and binary forms, with or without 
 *modification, are permitted provided that the following conditions are met:
 *
 *1) All redistributions of source code must retain the above copyright notice,
 * the list of authors in the original source code, this list of conditions and
 * the disclaimer listed in this license;
 *2) All redistributions in binary form must reproduce the above copyright 
 * notice, this list of conditions and the disclaimer listed in this license in
 * the documentation and/or other materials provided with the distribution;
 *3) Any documentation included with all redistributions must include the 
 * following acknowledgement:
 *
 *"This product includes software developed by the Community Grids Lab. For 
 * further information contact the Community Grids Lab at 
 * http://communitygrids.iu.edu/."
 *
 * Alternatively, this acknowledgement may appear in the software itself, and 
 * wherever such third-party acknowledgments normally appear.
 * 
 *4) The name Indiana University or Community Grids Lab or NaradaBrokering, 
 * shall not be used to endorse or promote products derived from this software 
 * without prior written permission from Indiana University.  For written 
 * permission, please contact the Advanced Research and Technology Institute 
 * ("ARTI") at 351 West 10th Street, Indianapolis, Indiana 46202.
 *5) Products derived from this software may not be called NaradaBrokering, 
 * nor may Indiana University or Community Grids Lab or NaradaBrokering appear
 * in their name, without prior written permission of ARTI.
 * 
 *
 * Indiana University provides no reassurances that the source code provided 
 * does not infringe the patent or any other intellectual property rights of 
 * any other entity.  Indiana University disclaims any liability to any 
 * recipient for claims brought by any other entity based on infringement of 
 * intellectual property rights or otherwise.  
 *
 *LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH NO 
 *WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA UNIVERSITY GIVES
 *NO WARRANTIES AND MAKES NO REPRESENTATION THAT SOFTWARE IS FREE OF 
 *INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR OTHER PROPRIETARY RIGHTS. 
 *INDIANA UNIVERSITY MAKES NO WARRANTIES THAT SOFTWARE IS FREE FROM "BUGS", 
 *"VIRUSES", "TROJAN HORSES", "TRAP DOORS", "WORMS", OR OTHER HARMFUL CODE.  
 *LICENSEE ASSUMES THE ENTIRE RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR 
 *ASSOCIATED MATERIALS, AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION 
 *GENERATED USING SOFTWARE.
 */
package cgl.narada.performance.gui;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.Vector;

import javax.swing.JFrame;

import cgl.narada.performance.LinkPerformanceDataImpl;
import cgl.narada.transport.LinkPerformanceData;

/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Company: </p>
 * @author Gurhan Gunduz
 * @version 1.0
 */

public class Chart3 extends JFrame {
  private long [] latency=new long[24];
  private int [] latencies=new int[25];
  private int [] std=new int[25];
  private int [] jitter=new int[25];
  private boolean color=true;
  private int[] xValue={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24};
  private int xPos=47;
  private int []  xPosPlot={67,87,107,127,147,167,187,207,227,247,267,287,307,327,347,367,387,407, 427,447, 467,487,507,527,547};
  private int counter=0, firstTime=0, value=0, endPoint=0;
//  private boolean notBeenThere=true;
//private LinkPerformanceData[] p_data;


  private Vector v=new Vector();

private LinkPerformanceData[] p_data = {
  new LinkPerformanceDataImpl("Mean","mean ","ms"),
  new LinkPerformanceDataImpl("Std Dev","Standart deviation","ms"),
  new LinkPerformanceDataImpl("jitter","Jitter","ms"),
//    new LinkPerformanceDataImpl("Throughput", "Throughput", "KB/Sec"),
  new LinkPerformanceDataImpl("Loss Rate", "Loss Rate", "%"),

};

  public Chart3() {
    super("CHART OF PERFORMANCE VALUES");
    //Graphics g;
    setSize(600,400);
    this.setBackground(Color.white);
    this.setLocation(300,300);
    //this.show();


  }

  public void paint(Graphics g){

    Graphics2D g2=(Graphics2D) g;
    g2.clearRect(40, 40, 550, 390);
    g2.setBackground(Color.white);
    g2.drawLine(50, 50, 50,350);
    g2.drawLine(50,350,550,350);
    g2.drawLine(546,347, 550, 350);
    g2.drawLine(546,353, 550, 350);
    g2.drawLine(47,53, 50, 50);
    g2.drawLine(53,53, 50, 50);
    for (int i = 70; i < 550; i+=20) {
      g2.drawLine(i, 348, i, 352);
      if (i<350) g2.drawLine(48,i,52,i);
    }
    if (counter>=24){
      arraySlide(xValue);
      xValue[xValue.length - 1] = counter + 1;
    }
    for (int i = 0; i < 24; i++) {
      xPos=((xPos+20)%547);
      if (xPos==0) xPos=67;
      g2.drawString(java.lang.Integer.toString(xValue[i]), xPos, 365);
      //System.out.print(" "+xValue[i]);
    }

    g2.setColor(Color.red);
    if (counter<25) endPoint=counter-1;
    else endPoint=23;
    for (int i = 0; i < endPoint; i++) {
      g2.drawLine(xPosPlot[i], 350-(std[i]*2+ 100),
                      xPosPlot[ i + 1],
                      350-(std[i+1]*2+ 100));
      System.out.println("endpoint"+endPoint);
    }

    g2.setColor(Color.blue);
    for (int i = 0; i < endPoint ; i++) {
      g2.drawLine(xPosPlot[i], 300-(latencies[i]*2+ 100),
                      xPosPlot[ i + 1],
                      300-(latencies[i+1]*2+ 100));

    }
    g2.setColor(Color.green);
    for (int i = 0; i < endPoint; i++) {
      g2.drawLine(xPosPlot[i], 250-(jitter[i]*2+ 100),
                      xPosPlot[ i + 1],
                      250-(jitter[i+1]*2+ 100));

    }

    for (int i = 0; i < endPoint; i++) {
      System.out.print(std[i]+" ");
    }
    System.out.println("");


//      System.out.println("double:" + Double.parseDouble("5.3"));
//      System.out.println("vvv" + p_data0[1].getParameterValue());
//      value = (int) Double.parseDouble(p_data0[1].getParameterValue());
//      System.out.println("Value" + value);
//    g2.drawLine(xPosPlot[counter % 24], (int) Double.parseDouble(p_data[1].getParameterValue()) + 100,
//                    xPosPlot[ (counter % 24) + 1],
//                    (int) Double.parseDouble(p[1].getParameterValue()) +
//                    100);

//    if (latency!=null){
//      for (int i = 0; i < latency.length - 1; i++) {
//        g2.drawLine( (70 + i * 20), (int) latency[i] + 100, (70 + (i + 1) * 20),
//                    (int) latency[i + 1] + 100);
//
//      }
//    }

//    counter++;

  }

  public int[] arraySlide(int [] array){
    for (int i = 0; i < array.length-1; i++) {
      array[i]=array[i+1];
    }
    return array;
  }

  public void setMonitoringData(LinkPerformanceData[] lpd){
    int l=0,s=0,j=0;
    if (firstTime>4){
      l=(int)Double.parseDouble(lpd[0].getParameterValue());
      s=(int)Double.parseDouble(lpd[1].getParameterValue());
      j=(int)Double.parseDouble(lpd[2].getParameterValue());
      if (counter>=24){
        arraySlide(latencies);
        arraySlide(std);
        arraySlide(jitter);
        if (l<100) latencies[23]=l;
             else latencies[23]=l;
        if (s<100) std[23]=l;
             else std[23]=l;
        if (j<100) jitter[23]=l;
             else jitter[23]=l;
      }else{
        if (l<100) latencies[counter%24]=l;
             else latencies[counter%24]=100;
        if (s<100) std[counter%24]=s;
             else std[counter%24]=100;
        if (j<100) jitter[counter%24]=j;
             else jitter[counter%24]=100;

//       latencies[counter%24]=(int)Double.parseDouble(lpd[0].getParameterValue());
//       std[counter%24]=(int)Double.parseDouble(lpd[1].getParameterValue());
//       jitter[counter%24]=(int)Double.parseDouble(lpd[2].getParameterValue());
      }
      if (counter==0) counter++;
      else{
        this.repaint();
        counter++;
      }
    }
    firstTime++;


//    if (p_data!=null) {
      //if (p_data0==null) p_data0=p_data;
//      copyMonitoringData(p_data);
//    }
//    copyMonitoringDatap(lpd);

//      p_data=lpd;
//    for (int i = 0; i < p_data.length; i++) {
//      System.out.print(p_data[i].getParameterValue()+"  ");
//
//    }
//
//    if (p_data0!=null){
//    for (int i = 0; i < p_data0.length; i++) {
//      System.out.print(p_data0[i].getParameterValue()+"  ");
//    }}
//   System.out.println(" ");
  }

  public void copyMonitoringData(LinkPerformanceData[] p){
    for (int i = 0; i < p.length; i++) {
      p_data[i].setParameterValue(p[i].getParameterValue());

    }


  }


  public void setLatencies(long [] values){
    latency = new long[values.length];
    for (int i = 0; i < values.length; i++) {
      latency[i]=values[i];
    }
//    for (int i = 0; i < latency.length; i++) {
//      System.out.print(latency[i]);
//    }
    this.repaint();

  }

  public static void main(String args[]){
    Chart c=new Chart("s");

    long[] lat = {
        50, 30, 20, 120, 110, 100, 150, 122, 134};
    c.setLatencies(lat);
    c.show();
    c.repaint();




//    long[] lat1 = {
//        150, 130, 120, 200, 110, 300, 200, 222, 234, 150,120};
//    c.setLatencies(lat1);
//    c.show();
//    long[] lat2 = {
//        150, 130, 120, 200, 110, 300, 200, 222, 234,150,120,170,200};
//    c.setLatencies(lat2);
//    c.show();
//    long[] lat3 = {
//        150, 130, 120, 200, 110, 300, 200, 222, 234};
//    c.setLatencies(lat3);
//    c.show();



  }



}
